#include<iostream>
#include<unistd.h>
#include<sys/wait.h>
using namespace std;
int main()
{
    pid_t id=fork();
    if(id < 0)
    {
        cout<<"创建进程失败"<<endl;
    }
    else if(id == 0)
    {
        //创建子进程
        int cnt=5;
        while(cnt--)
        {
            cout<<"我是子进程："<<cnt<<endl;
            sleep(1);
        }
    }
    else
    {
        //父进程
        int status=0;
        //pid_t res=wait(nullptr);
        //阻塞状态的等待
        //pid_t res=waitpid(id,&status,0);
        //cout<<"子进程回收成功,且回收的pid是："<<res<<endl;
        //cout<<"退出码是："<<WIFEXITED(status)<<endl;
        // printf("%d\n",(status>>8)&0xFF);
        // printf("%d\n",WEXITSTATUS(status));
        //非阻塞状态的等待
        while(1)
        {
            pid_t res=waitpid(id,&status,WNOHANG);
            if(res>0)
            {
                cout<<"回收成功,且退出码是："<<WEXITSTATUS(status)<<endl;
                break;
            }
            else if(res==0)
            {
                cout<<"子进程没有执行完，回收失败"<<endl;
                cout<<"干点其他的事？"<<endl;
                sleep(1);
                //替换进程
                execl("usr/bin/ls","ls","-a","-l",NULL);
                printf("任务一\n");
            }
            else
            {
                cout<<"回收失败"<<endl;

            }
        }
    }
    return 0;
}

